package com.dbms.parser.ast;

import com.dbms.common.Constants;
import com.dbms.common.Position;

import java.util.List;

/**
 * InsertNode (插入节点) 代表了 `INSERT` 语句的抽象语法树 (AST) 结构。
 * 它存储了执行一条插入语句所需的所有信息：目标表名、可选的列名列表以及要插入的值列表。
 */
public class InsertNode extends StatementNode {
    /**
     * 要插入数据的目标表的名称。
     */
    private final String tableName;
    /**
     * 一个可选的列名列表。
     * 例如，在 `INSERT INTO t(c1, c2) VALUES (...)` 中，它会是 `["c1", "c2"]`。
     * 如果省略（如 `INSERT INTO t VALUES (...)`），这个列表可能为空或 null。
     */
    private final List<String> columnNames;
    /**
     * 要插入的值的列表，以字符串形式存储。
     */
    private final List<String> values;

    /**
     * 构造函数，用于创建一个 InsertNode。
     * @param position 语句在原始 SQL 中的位置
     * @param tableName 目标表名
     * @param columnNames 列名列表（可以为 null 或空）
     * @param values 值列表
     */
    public InsertNode(Position position, String tableName, List<String> columnNames, List<String> values) {
        super(position);
        this.tableName = tableName;
        this.columnNames = columnNames;
        this.values = values;
    }

    /**
     * 实现父类的抽象方法，返回 INSERT 语句的类型标识。
     * @return "Insert" 常量
     */
    @Override
    public String getStatementType() {
        return Constants.STATEMENT_INSERT;
    }

    /**
     * 获取目标表名。
     * @return 表名字符串
     */
    public String getTableName() {
        return tableName;
    }

    /**
     * 获取列名列表。
     * @return 列名字符串的列表
     */
    public List<String> getColumnNames() {
        return columnNames;
    }

    /**
     * 获取要插入的值的列表。
     * @return 值的字符串列表
     */
    public List<String> getValues() {
        return values;
    }

    /**
     * 生成该节点的字符串表示，方便调试。
     * @return 描述该节点的字符串
     */
    @Override
    public String toString() {
        return "InsertNode{\n" +
                "    tableName='" + tableName + "',\n" +
                "    columnNames=" + columnNames + ",\n" +
                "    values=" + values + "\n" +
                "}";
    }
}